package com.mf.springboot.backend.userAuth.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * Created by lx on 2017/9/18.
 */
//描述切面类
@Aspect
@Component
public class TestAop {

    /*
     * 定义一个切入点
     */
    @Pointcut("@annotation(com.mf.springboot.backend.userAuth.aop.MyInfoAnnotation)")
    public void myInfoAnnotation() {
    }


    // 用@Pointcut来注解一个切入方法
    @Pointcut("execution(* com.mf.springboot.backend.userAuth.service.*.*(..))")
    public void excudeService() {
    }

    /*
     * 通过连接点切入

    @Before("execution(* findById*(..)) &&" + "args(id,..)")
    public void twiceAsOld1(Long id) {
        System.out.println("切面before执行了。。。。id==" + id);

    }
    */

    @Before(value="myInfoAnnotation()")
    public void afterTest(JoinPoint jp)
    {
        System.out.println(jp.getArgs());
    }


    //@annotation 这个你应当知道指的是匹配注解
    //括号中的 annotation 并不是指所有自定标签，而是指在你的注释实现类中 *Aspect 中对应注解对象的别名，所以别被俩 annotation  所迷惑。
//    @Around(value ="myInfoAnnotation()&&excudeController()&&@annotation(annotation)")
//    public Object twiceAsOld(ProceedingJoinPoint thisJoinPoint,
//                             MyInfoAnnotation annotation
//    ) {
//        System.out.println(annotation.value());
//
//        return null;
//    }

}
